home *** CD-ROM | disk | FTP | other *** search
/ MacWorld Secrets (4th Edition) / Mac Secrets CD 4th Ed.toast / Shareware & Freeware / KeyQuencer 1.2.2 / Developer’s toolkit / Glue sample code / GlueSample.c next >
C/C++ Source or Header  |  1995-12-16  |  6KB  |  204 lines

  1. //==============================================================================
  2. // KEYQUENCER GLUE SAMPLE - VERSION 1.2.2 - DECEMBER 1995
  3. // By Alessandro Levi Montalcini <alm@torino.alpcom.it>
  4. // ©1994-96 Binary Software, Inc. <binarysoft@eworld.com>
  5. // This text looks best in monaco 9 font, 4 spaces per tab, no wrapping
  6. //==============================================================================
  7.  
  8. #include "Extension.h"
  9. #include "KQGestalt.h"
  10. #include "KQPPCGlue.h"
  11.  
  12. //==============================================================================
  13.  
  14. short    BuildMacrosMenu            (MenuHandle mhandle);
  15. void    ExecuteMacroFromMenu    (short menu, short item);
  16. void    DoMenu                    (long selection);
  17.  
  18. //==============================================================================
  19.  
  20. short    gRunning = true;
  21.  
  22. //==============================================================================
  23. // Build a menu containing a list of all the installed KeyQuencer macros:
  24.  
  25. short BuildMacrosMenu(MenuHandle mhandle)
  26. {
  27.     GluePtr        glue;        // points to the KeyQuencer glue record containing callback routine pointers
  28.     short        *sorted;    // an array of shorts to be used as indexes when getting the macro names
  29.     short        count;        // number of KeyQuencer macros that are currently installed
  30.     short        index;        // index into the sorted indexes array
  31.     short        macroIndex;    // index passed to GetMacroInfo
  32.     short        keyCode;    // receives the key code of the macro's keystroke in the word's high byte
  33.     short        modifiers;    // receives the modifiers of the macro's keystroke
  34.     Str31        name;        // receives the name of the macro
  35.     
  36.     count = 0;
  37.     
  38.     // get a pointer to the KeyQuencer glue (NIL if KQ is not installed):
  39.     glue = GetKeyQuencerGlue();
  40.     
  41.     // glue version 5 is required to get the macro names:
  42.     if(glue!=0L && glue->glueRecVers >= 5)
  43.     {
  44.         // get the number of installed macros:
  45.         count = CallKQCountMacrosProc(glue->CountMacros);
  46.         
  47.         // build a sorted index of all the installed macros:
  48.         sorted = (short*)CallKQBuildSortedIndexProc(glue->BuildSortedIndex);
  49.         if(sorted)
  50.         {
  51.             // add each macro name to the menu:
  52.             for(index=0; index<count; ++index)
  53.             {
  54.                 // get the right index from our sorted index:
  55.                 macroIndex = sorted[index];
  56.                 
  57.                 // get the macro's name:
  58.                 CallKQGetMacroInfoProc(glue->GetMacroInfo, macroIndex, name, &keyCode, &modifiers);
  59.                 
  60.                 // add the name to the menu if it's not empty:
  61.                 // (use AppendMenu/SetItem to ignore metacharacters)
  62.                 if(name[0]>0)
  63.                 {
  64.                     AppendMenu(mhandle, "\p ");
  65.                     SetMenuItemText(mhandle, CountMItems(mhandle), name);
  66.                 }
  67.             }
  68.             
  69.             // dispose the sorted index, which was created as a Ptr in the sys heap:
  70.             DisposePtr((Ptr)sorted);
  71.         }
  72.     }
  73.     return count;
  74. }
  75.  
  76. //==============================================================================
  77. // Execute a macro whose name is stored as a menu item title:
  78.  
  79. void ExecuteMacroFromMenu(short menu, short item)
  80. {
  81.     MenuHandle    mhandle;    // menu handle of the macros menu
  82.     Handle        macro;        // a handle containing the text of the macro, created in the sys heap
  83.     GluePtr        glue;        // points to the KeyQuencer glue record containing callback routine pointers
  84.     short        macroErr;    // nonzero if a syntax error was found in the macro or the queue was full
  85.     Str255        name;        // name of the macro, as stored in the menu item (a menu item could be longer than 31 chars)
  86.     
  87.     // get a pointer to the KeyQuencer glue (NIL if KQ is not installed):
  88.     glue = GetKeyQuencerGlue();
  89.     
  90.     // glue version 5 is required to get the macro names:
  91.     if(glue!=0L && glue->glueRecVers >= 5)
  92.     {
  93.         // get the menu handle:
  94.         mhandle = GetMenuHandle(menu);
  95.         if(mhandle)
  96.         {
  97.             // get the menu item:
  98.             GetMenuItemText(mhandle, item, name);
  99.             
  100.             // get the KeyQuencer macro whose name matches the menu item:
  101.             macro = CallKQGetNamedMacroProc(glue->GetNamedMacro, name);
  102.             if(macro)
  103.             {
  104.                 // execute the macro:
  105.                 macroErr = CallKQExecuteScriptProc(glue->ExecuteScript, macro);
  106.                 
  107.                 // dispose of the macro (it's a handle created in the sys heap):
  108.                 DisposeHandle(macro);
  109.             }
  110.         }
  111.     }
  112. }
  113.  
  114. //==============================================================================
  115. // This main routine implements a very basic event loop which only handles
  116. // menu selections from the mouse and the keyboard. It is way too stupid to
  117. // be commented...
  118.  
  119. void main(void)
  120. {
  121.     Handle        mbar;
  122.     MenuHandle    mhandle;
  123.     WindowRef    window;
  124.     long        selection;
  125.     short        where;
  126.     EventRecord    event;
  127.     
  128.     MaxApplZone();
  129.     MoreMasters();
  130.     InitGraf(&qd.thePort);
  131.     InitFonts();
  132.     InitWindows();
  133.     InitMenus();
  134.     TEInit();
  135.     InitCursor();
  136.     InitDialogs(0L);
  137.     FlushEvents(everyEvent, 0);
  138.     
  139.     mbar = GetNewMBar(128);
  140.     if(mbar)
  141.     {
  142.         SetMenuBar(mbar);
  143.         DrawMenuBar();
  144.         mhandle = GetMenuHandle(130);
  145.         (void)BuildMacrosMenu(mhandle);
  146.         
  147.         while(gRunning)
  148.         {
  149.             if(WaitNextEvent(everyEvent, &event, 30L, 0L))
  150.             {
  151.                 switch(event.what)
  152.                 {
  153.                     case mouseDown:
  154.                         where = FindWindow(event.where, &window);
  155.                         switch(where)
  156.                         {
  157.                             case inMenuBar:
  158.                                 selection = MenuSelect(event.where);
  159.                                 if(selection) DoMenu(selection);
  160.                                 HiliteMenu(0);
  161.                                 break;
  162.                         }
  163.                         break;
  164.                     
  165.                     case keyDown:
  166.                         if(event.modifiers & cmdKey)
  167.                         {
  168.                             selection = MenuKey((unsigned char)event.message);
  169.                             if(selection) DoMenu(selection);
  170.                             HiliteMenu(0);
  171.                         }
  172.                         break;
  173.                 }
  174.             }
  175.         }
  176.     }
  177.     ExitToShell();
  178. }
  179.  
  180. //==============================================================================
  181. // Menu selection switch:
  182.  
  183. void DoMenu(long selection)
  184. {
  185.     short    menu, item;
  186.     
  187.     menu = (short)(selection>>16);
  188.     item = (short)(selection&0xFFFF);
  189.     switch(menu)
  190.     {
  191.         case 128:
  192.             // apple menu not supported in this sample
  193.             break;
  194.         case 129:
  195.             if(item==1) gRunning = false;
  196.             break;
  197.         case 130:
  198.             ExecuteMacroFromMenu(menu, item);
  199.             break;
  200.     }
  201. }
  202.  
  203. //==============================================================================
  204.